#include "my_inc/main_login.h"

// 文本框&键盘事件
void ta_event_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);               // 获取事件类型
    lv_obj_t * ta        = lv_event_get_target(e);             // 获取触发事件的对象（文本框）
    lv_obj_t * kb        = lv_event_get_user_data(e);          // 获取用户数据（键盘对象）
    if(code == LV_EVENT_CLICKED || code == LV_EVENT_FOCUSED) { // LV_EVENT_FOCUSED对象被聚焦
        if(kb != NULL) lv_keyboard_set_textarea(kb, ta);       // 关联键盘到当前文本框
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);             // 显示键盘
    } else if(code == LV_EVENT_READY) { // 一个过程已经完成:::触发条件：用户按下键盘的"确定"或"完成"按钮
        LV_LOG_USER("Ready, current text: %s", lv_textarea_get_text(ta)); // 日志记录
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);                          // 隐藏键盘
    } else if(
        code == LV_EVENT_CANCEL ||
        code == LV_EVENT_DEFOCUSED) { //  CANCEL一个过程被取消;DEFOCUSED对象散焦;触发条件：用户取消输入或文本框失去焦点
        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
    } else if(code == LV_EVENT_VALUE_CHANGED) { // 检查光标是否隐藏（通过检查光标状态）
        if(!lv_textarea_get_cursor_click_pos(ta)) {
            lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
        }
    }
    /*
    这个函数返回光标是否处于可点击位置（即是否显示）：
    true：光标显示
    false：光标隐藏
    */
}

// 定时器回调函数
void update_time_label(lv_timer_t * timer)
{
    lv_obj_t * label = timer->user_data;
    char * t         = time_get();
    lv_label_set_text(label, t);
    free(t); // 记得释放内存！
}

// 密码验证函数 至少包含大小写字母和数字
bool is_valid_password(const char * password)
{
    if(password == NULL) return false;

    int len = strlen(password);

    bool has_upper = false;
    bool has_lower = false;
    bool has_digit = false;

    for(int i = 0; i < len; i++) {
        if(isupper(password[i]) || islower(password[i])) {
            has_upper = true;
            has_lower = true;
        } else if(isdigit(password[i])) {
            has_digit = true;
        }
        // else if(strchr("!@#$%^&*()", password[i])) { ... }
    }

    return has_upper && has_lower && has_digit;
}

// 震动动画回调函数
static void shake_anim_cb(void * var, int32_t v)
{
    lv_obj_t * obj = (lv_obj_t *)var;
    // 随机偏移位置，产生震动效果
    int8_t x_offset = rand() % 10 - 5; // -5 到 +5 的随机数
    int8_t y_offset = rand() % 10 - 5; // -5 到 +5 的随机数
    
    lv_obj_set_pos(obj, 0 + x_offset, 25 + y_offset);
}

// 震动完成回调
static void shake_ready_cb(lv_anim_t * a)
{
    // 动画完成后将对象重置到原始位置
    lv_obj_set_pos(a->var, 0, 25);
}

// 开始震动动画
void start_shake_animation(lv_obj_t * obj)
{
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_var(&a, obj);
    lv_anim_set_exec_cb(&a, shake_anim_cb);
    lv_anim_set_values(&a, 0, 100);
    lv_anim_set_time(&a, 500); // 震动持续500ms
    lv_anim_set_ready_cb(&a, shake_ready_cb);
    lv_anim_set_repeat_count(&a, 1); // 重复1次（总共播放2次）
    lv_anim_start(&a);
}

// 登录按钮回调函数
void in_but_cb(lv_event_t * e)
{
    login_p data = lv_event_get_user_data(e);
    // 获取用户名和密码
    const char * username = lv_textarea_get_text(data->username_ta);
    const char * password = lv_textarea_get_text(data->password_ta);
    strcpy(data->username, username);
    strcpy(data->psw, password);
    // 验证逻辑
    if(strlen(username) == 0) {
        lv_label_set_text(label_hint, "用户名不能为空!");
        lv_obj_set_style_text_color(label_hint, lv_color_hex(0xff0000), LV_PART_MAIN);
        start_shake_animation(label_hint);
        return;
    }

    if(strlen(password) == 0) {
        lv_label_set_text(label_hint, "密码不能为空!");
        lv_obj_set_style_text_color(label_hint, lv_color_hex(0xff0000), LV_PART_MAIN);
        start_shake_animation(label_hint);

        return;
    }
    int temp = contrast_reg(data->admain, data);
    if(temp == 1) {
        face_p head = data->admain->head;
        face_p scr  = find(head, "主界面");
        lv_obj_t * temp;
        if(scr == NULL) {
            // 第一次进入，创建新游戏
            main_face(data->admain->head);
            scr = find(head, "主界面");
        }
        temp = scr->screen;
        lv_scr_load(temp);
    }
}

// 注册按钮回调函数
void reg_but_cb(lv_event_t * e)
{
    lv_event_code_t code  = lv_event_get_code(e); // 获取事件类型
    login_p login         = lv_event_get_user_data(e);
    lv_obj_t * btn_in     = login->btn_in;
    lv_obj_t * btn_re     = login->btn_re;
    lv_obj_t * label_warn = login->label_warn;
    const char * text     = lv_label_get_text(label_warn); // 获取标签中的文本
    if(code == LV_EVENT_CLICKED && login->je) {
        // 获取用户名和密码
        const char * username = lv_textarea_get_text(login->username_ta);
        const char * password = lv_textarea_get_text(login->password_ta);
        strcpy(login->username, username);
        strcpy(login->psw, password);
        insertend_reg(login->admain, login);
    } else if(code == LV_EVENT_CLICKED) {
        lv_obj_add_flag(btn_in, LV_OBJ_FLAG_HIDDEN);   // 隐藏按钮
        lv_obj_clear_flag(btn_re, LV_OBJ_FLAG_HIDDEN); // 显示按钮
        lv_label_set_text(label_warn, "这是注册页面!");
        lv_obj_set_style_text_color(label_warn, lv_color_hex(0X00ff00), LV_PART_MAIN);
        login->je = 1;
    }
}

// 返回按钮事件
void retuen_but_cb(lv_event_t * e)
{
    lv_event_code_t code  = lv_event_get_code(e); // 获取事件类型
    login_p login         = lv_event_get_user_data(e);
    lv_obj_t * btn_in     = login->btn_in;
    lv_obj_t * btn_re     = login->btn_re;
    lv_obj_t * label_warn = login->label_warn;
    if(code == LV_EVENT_CLICKED) {
        lv_obj_add_flag(btn_re, LV_OBJ_FLAG_HIDDEN);   // 隐藏按钮
        lv_obj_clear_flag(btn_in, LV_OBJ_FLAG_HIDDEN); // 显示按钮
        lv_label_set_text(label_warn, "这是登录页面!");
        lv_obj_set_style_text_color(label_warn, lv_color_hex(0Xff0000), LV_PART_MAIN);
        login->je = 0;
    }
}


